
from random import randint
import pygame
#定义屏幕大小常量
SCREEN_RECT = pygame.Rect(0,0,480,700)
#创建敌机定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
#英雄发射子弹事件
HERO_FIRE_EVENT = pygame.USEREVENT + 1

class Gamesprite(pygame.sprite.Sprite):
    '''飞机大战游戏精灵'''
    def __init__(self,image_name,speed = 1):
        #调用父类初始化
        super().__init__()
        #定义对象属性
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        self.speed = speed
    def update(self):
        '''精灵在屏幕中的移动改变'''
        self.rect.y += self.speed

class BackGround(Gamesprite):
    '''游戏背景的精灵'''
    def __init__(self,is_all = False):
        super().__init__('素材/images/background.png')
        bg3 = pygame.image.load('素材/images/gameover.png')
        #判断是否是交替图片，如说是交替图片(第二张图片)，需要设置初始位置
        if is_all:
            self.rect.y = -self.rect.height  # 第二张图片初始位置
    # def bg(self):
    #     super. __init__('素材/images/gameover.png')
    #     SCREEN_RECT = self.rect
    def update(self):
        # 调用父类的update方法
        super().update()
        # 判断是否移出屏幕，如果移出，将图片设置到屏幕上方
        if self.rect.y >= SCREEN_RECT.height:
            self.rect.y = -self.rect.height

class Enemy(Gamesprite):
    '''敌机精灵'''
    def __init__(self):
        #调用父类的方法，创建敌机精灵，同时指定敌机图片
        super().__init__('素材/images/enemy0.png')

        #随机指定敌机初始速度
        self.speed = randint(2,3)
        #随机指定敌机初始位置
        #确定敌机x可以取到最大值
        max_x = SCREEN_RECT.width - self.rect.width
        self.rect.x = randint(0,max_x)
        self.rect.y = -self.rect.height
    def update(self):
        #调用父类的方法，保持处置方向飞行
        super().update()
        #判断是否飞出屏幕  如果是将精灵从精灵组中删除
        if self.rect.y >= SCREEN_RECT.height:
            print('飞出屏幕，删除精灵')
            #kill可以将飞出屏幕的精灵从精灵组中移除，并将其销毁
            self.kill()
class Enemy2(Gamesprite):
    '''敌机精灵'''
    def __init__(self):
        #调用父类的方法，创建敌机精灵，同时指定敌机图片
        super().__init__('素材/images/enemy1.png')

        #随机指定敌机初始速度
        self.speed = randint(2,3)
        #随机指定敌机初始位置
        #确定敌机x可以取到最大值
        max_x = SCREEN_RECT.width - self.rect.width
        self.rect.x = randint(0,max_x)
        self.rect.y = -self.rect.height
    def update(self):
        #调用父类的方法，保持处置方向飞行
        super().update()
        #判断是否飞出屏幕  如果是将精灵从精灵组中删除
        if self.rect.y >= SCREEN_RECT.height:
            print('飞出屏幕，删除精灵')
            #kill可以将飞出屏幕的精灵从精灵组中移除，并将其销毁
            self.kill()
class Hero(Gamesprite):
    #英雄机精灵
    def __init__(self):
        super().__init__('素材/images/hero1.png',0)
        # 设置英雄机初始位置
        self.rect.centerx = SCREEN_RECT.centerx
        self.rect.bottom = SCREEN_RECT.bottom - 120
        self.yspeed = 0
        #创建子弹精灵组
        self.bullet = pygame.sprite.Group()
    def update(self):
        #英雄机水平移动，
        self.rect.x += self.speed
        self.rect.y += self.yspeed
        if self.rect.x < 0:
            self.rect.x = 0
        elif self.rect.right > SCREEN_RECT.right:
            self.rect.right = SCREEN_RECT.right
        elif self.rect.y < SCREEN_RECT.y:
            self.rect.y = SCREEN_RECT.y
        elif self.rect.bottom > SCREEN_RECT.bottom:
            self.rect.bottom = SCREEN_RECT.bottom

    def fire(self):
        print('发射子弹')
        #1.创建子弹精灵
        bullet = Bullet()
        #2.设置精灵的初始位置
        bullet.rect.bottom = self.rect.y - 5
        bullet.rect.centerx = self.rect.centerx
        #3.将精灵添加大精灵组中
        self.bullet.add(bullet)

class Bullet(Gamesprite):
    def __init__(self):
        #调用父类方法
        super().__init__('素材/images/bullet1.png',-2)
    def update(self):
        #调用父类方法
        super().update()
        #判断子弹是否飞出屏幕
        if self.rect.bottom < 0:
            self.kill()









